package com.mobimap.nhom9.dao;

import java.util.ArrayList;
import java.util.List;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.mobimap.nhom9.dao.table.IDTOConverter;

public final class QueryHelper {

	public static <DTO> DTO rawQueryOject(SQLiteDatabase db, String sql,
			String[] selectionArgs, IQueryHandler<DTO> handler) {
		Cursor cursor = db.rawQuery(sql, selectionArgs);
		if (cursor.moveToFirst()) {
			DTO dto = handler.GetConverter().cusorToDTO(cursor);
			if (handler.handle(dto))
				return dto;
		}
		return null;
	}

	public static <DTO> DTO rawQueryOject(SQLiteDatabase db, String sql,
			String[] selectionArgs, IDTOConverter<DTO> converter) {
		Cursor cursor = db.rawQuery(sql, selectionArgs);
		if (cursor.moveToFirst()) {
			DTO dto = converter.cusorToDTO(cursor);
			return dto;
		}
		return null;
	}

	public static <DTO> List<DTO> rawQuery(SQLiteDatabase db, String sql,
			String[] selectionArgs, IQueryHandler<DTO> handler) {
		Cursor cursor = db.rawQuery(sql, selectionArgs);
		return cursorToDTOs(cursor, handler);
	}

	public static <DTO> List<DTO> rawQuery(SQLiteDatabase db, String sql,
			String[] selectionArgs, IDTOConverter<DTO> converter) {
		Log.e("DAO", sql);
		Cursor cursor = db.rawQuery(sql, selectionArgs);
		return cursorToDTOs(cursor, converter);
	}

	public static <DTO> List<DTO> cursorToDTOs(Cursor cursor,
			final IDTOConverter<DTO> converter) {
		List<DTO> result = new ArrayList<DTO>();
		if (null == cursor || !cursor.moveToFirst())
			return result;

		do {
			DTO dto = converter.cusorToDTO(cursor);
			result.add(dto);
		} while (cursor.moveToNext());
		return result;
	}

	public static <DTO> List<DTO> cursorToDTOs(Cursor cursor,
			IQueryHandler<DTO> handler) {
		List<DTO> result = new ArrayList<DTO>();
		if (null == cursor || !cursor.moveToFirst())
			return result;

		do {
			if (handler.isInterrupt())
				break;
			DTO dto = handler.GetConverter().cusorToDTO(cursor);
			if (handler.handle(dto))
				result.add(dto);
		} while (cursor.moveToNext());
		return result;
	}
}
